//
//  main.cpp
//  全排列
//
//  Created by mac on 2020/5/10.
//  Copyright © 2020 DDI. All rights reserved.
//

//#include<bits/stdc++.h>

#include <iostream>
using namespace std;

int num[20] = {0}, n;                    //定义一个全局变量的数组和n

/*交换函数，将两个数进行交换*/
void Change(int &a, int &b)
{
    int temp =a;
    a = b;
    b = temp;
}

/*输出数组函数，将函数按规定要求输出*/
void Dispaly()
{
    for (int q = 1; q <= 2*n; q++)      //循环输出
    {
        cout<<num[q]<<" ";
        if (q == n)                     //整个数组输出到n时换行，便可变成两行输出
            cout<<endl;
    }
   cout<<endl<<endl;
}

/*全排列函数，对数组进行全排列，选取符合条件的数组*/
void funt(int a, int b)
{
    if (a == b)                         //如果交换到了最后一个，那就结束了，进入条件判断
    {
        int flag = 1;                   //设一个开关，指数组是否符合条件
        for (int q = 1; q < 2*n; q++)   //条件1：各行左边小于右边
        {
            if (q == n)                 //换行中间的两个数不需要比较，跳过
                continue;
            if (num[q] > num[q+1])      //进行比较
                flag = 0;               //条件不符合，开关关掉，不输出数组
        }
        for (int q = 1; q <= n; q++)    //条件2：上面的数小于下面的数
            if (num[q] > num[q+n])      //进行比较
                flag = 0;               //条件不符合，开关关掉，不输出数组
        if (flag)                       //条件符合
            Dispaly();                  //输出数组
    }
    else
    {
        for (int i = a; i <= b; i++)    //从a到b循环交换
        {
            Change(num[a], num[i]);     //交换a，i的值
            funt(a+1, b);               //递归交换，进行下一个数步交换
            Change(num[a], num[i]);     //回溯，将原来的书交换回来
        }
    }
}

int main()
{
    while (true)
    {
        cout<<"请输入n:";
        cin>>n;
        for (int q = 1; q <= 2*n; q++)
            num[q] = q;
        funt(1, 2*n);
    }
    
    return 0;
}
}
